package com.way;

import java.util.HashMap;

/**
 * 统一结果返回对象
 * 继承自 HashMap, 提供 put 方法, 你可以方便的是用 key value 映射的方式, 加入自己需要的任何内容.
 * 是我们全局的 统一资源返回格式.
 *
 * @author way
 */
public class CommonResult extends HashMap<String, Object> {

    private static final String CODE_KEY_STRING = "code";

    private static final String MSG_KEY_STRING = "msg";

    private static final String DATA_KEY_STRING = "data";

    private CommonResult() {
        put(CODE_KEY_STRING, 0);
        put(MSG_KEY_STRING, "success");
    }

    /**
     * 失败返回
     *
     * @return 失败的 <link>UniformResult</link> 对象.
     */
    public static CommonResult fail() {
        return fail(500, "error");
    }

    /**
     * 失败返回, 有机会自定义返回的消息内容
     *
     * @param msg 自定义消息内容
     * @return 失败的 <link>UniformResult</link> 对象.
     */
    public static CommonResult fail(String msg) {
        return fail(500, msg);
    }

    /**
     * 失败返回, 有机会自定义返回的编码和消息内容
     *
     * @param code 自定义返回编码
     * @param msg  自定义消息内容
     * @return 失败的 <link>UniformResult</link> 对象.
     */
    public static CommonResult fail(int code, String msg) {
        CommonResult r = new CommonResult();
        r.put(CODE_KEY_STRING, code);
        r.put(MSG_KEY_STRING, msg);
        return r;
    }

    /**
     * 成功返回, 有机会自定义返回的消息内容
     *
     * @param msg 自定义的返回内容
     * @return 成功的 <link>UniformResult</link> 对象.
     */
    public static CommonResult success(String msg) {
        CommonResult r = new CommonResult();
        r.put(MSG_KEY_STRING, msg);
        return r;
    }

    /**
     * 成功返回, 有机会自定义返回的主体对象
     *
     * @param obj 返回的主体对象
     * @return 成功的 <link>UniformResult</link> 对象.
     */
    public static CommonResult success(Object obj) {
        CommonResult r = new CommonResult();
        r.put(DATA_KEY_STRING, obj);
        return r;
    }

    /**
     * 成功返回, 使用默认返回内容
     *
     * @return 成功的 <link>UniformResult</link> 对象.
     */
    public static CommonResult success() {
        return new CommonResult();
    }

    /**
     * 等价于HashMap的pub方法, 用于向自身添加需要额外key value形式的内容
     * 由于最终返回 UniformResult 对象, 所以支持如下的秀操作(链式操作):
     * ur.put(a,b).put(c,d).put(*,*).......;
     *
     * @param key   添加属性的key
     * @param value 添加属性的value
     * @return 被操作的 UniformResult 对象自身
     */
    @Override
    public CommonResult put(String key, Object value) {
        super.put(key, value);
        return this;
    }
}